<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //  案例1
        // var num = 10
        // fun()
        // function fun() {
        //     console.log(num);
        //     var num = 20
        // }
        //    预解析过程（变量提升，函数提升）
        // var num;
        // function fun() {
        //     var num;
        //     console.log(num);//根据作用域链 就近原则 var num;  所以结果为 undefined 
        //     num = 20
        // }
        // num = 10;
        // fun()


        // 案例2
        // var num = 10
        // function fn() {
        //     console.log(num);
        //     var num = 20
        //     console.log(num);
        // }
        // fn()
        //   预解析过程 变量提升 函数提升
        // var num;
        // function fn() {
        //     var num;
        //     console.log(num);//undefined
        //     num = 20
        //     console.log(num);//20
        // }
        // num = 10;
        // fn()

        // 案例3
        // var a = 18
        // f1()
        // function f1() {
        //     var b = 9
        //     console.log(a);
        //     console.log(b);
        //     var a = '123'
        // }
        // 预解析过程 变量提升 函数提升 只提变量与函数 其他都是按原顺序排列 然后代码执行 作用域链的 就近原则
        // var a;
        // function f1() {
        //     var b
        //     var a
        //     b = 9
        //     console.log(a);// var a ; undefined
        //     console.log(b);// b = 9 ;9
        //     a = '123'
        // }

        // a = 18
        // f1()

        // 案例4

        f1()
        console.log(c);
        console.log(b);
        console.log(a);
        function f1() {
            var a = b = c = 9
            console.log(a);
            console.log(b);
            console.log(c);
        }
        // 预解析 函数提升 函数域变量提升
        function f1() {
            var a
            a = b = c = 9
            // var a = b = c = 9  相当于 var a = 9; b = 9; c = 9; b和c是直接赋值的 没有var声明 所以是当做全局变量来看
            // 集体声明是用 var a = 9,b = 9, c = 9; 这样才是 a和b前面有var 是用逗号隔开
            console.log(a);//9
            console.log(b);//9
            console.log(c);//9
        }
        f1()
        console.log(c);//9 // c=9  全局声明  可以调用
        console.log(b);//9 b=9 全局声明 可以调用
        console.log(a);//var a 在上面的函数里是属于局部变量 这里输出的是全局变量a 在函数外从未声明定义 所结果为报错

    </script>
</head>

<body>

</body>

</html>